package edu.unc.comp410.colemangeer.model.object;

import edu.unc.comp410.sharedcode.Observer;


public abstract class MutableObject implements IStandardObject, Cloneable {
	
	/**
	 * Creates and returns a copy of this object.
	 * @requires true
	 * @returns clone equals the original, clone is same data type,
	 * and shallow copy is not produced.
	 * 		\result.equals(x) AND
	 * 		\result.getClass() == x.getClass() AND
	 * 		\result() != x
	 */
	@Override @Observer public abstract Object clone() throws CloneNotSupportedException;

	// Re-abstract <CODE>equals</CODE>, <CODE>hashCode</CODE>.
	// and <CODE>toString</CODE> forcing implementations to
	// redefine these member functions. This explicitly avoids
	// accidental inheritance of Objects's versions of these.
	@Override public abstract boolean equals(Object obj);

	@Override public abstract int hashCode();

	@Override public abstract String toString();
}
